#include "http.h"
#include "string.h"
#include "stdio.h"

char uart_rx_buffer[UART_RX_BUFFER_SIZE];
size_t uart_rx_length;

/**
 * @brief 发送HTTP请求到ESP8266
 * @param request HTTP请求配置
 * @return true发送成功，false失败
 */
bool http_request_send(const HttpRequest *request) {
    if (!request || !request->host || !request->path) {
        return false;
    }

    char buffer[512]; // 根据实际需求调整大小
    int len;

    // 1. 建立TCP连接
    len = snprintf(buffer, sizeof(buffer), "AT+CIPSTART=4,\"TCP\",\"%s\",%d\r\n", 
                   request->host, request->port);
    ESP8266_SendData(buffer, len);
    
    // 等待ESP8266返回"CONNECT"（实际项目中需超时处理）
    // 这里简化流程，实际需解析串口响应

    // 2. 构造HTTP请求
    if (request->type == HTTP_GET) {
        // GET请求（无JSON body）
        len = snprintf(buffer, sizeof(buffer),
                       "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n",
                       request->path, request->host);
    } else {
        // POST请求（带JSON body）
        len = snprintf(buffer, sizeof(buffer),
                       "POST %s HTTP/1.1\r\nHost: %s\r\n"
                       "Content-Type: application/json\r\n"
                       "Content-Length: %d\r\n\r\n%s",
                       request->path, request->host,
                       (int)strlen(request->json_body), request->json_body);
    }
    printf("%s\n ", buffer);
    printf("len = %d\n ", len);
    HAL_Delay(200);
    // 3. 发送请求数据
    char send_cmd[64];
    snprintf(send_cmd, sizeof(send_cmd), "AT+CIPSEND=4,%d\r\n", len);
    ESP8266_SendData(send_cmd, strlen(send_cmd));
    HAL_Delay(200);
    
    // 等待ESP8266返回">"（实际项目中需超时处理）
    ESP8266_SendData(buffer, len);
    HAL_Delay(200);
    
    // 4. 关闭连接
    // ESP8266_SendData("AT+CIPCLOSE=4\r\n", 13);
    // HAL_Delay(200);

    return true;
}

// // 示例：发送POST请求（JSON数据）
// void send_http_post() {
//     HttpRequest request = {
//         .type = HTTP_POST,
//         .host = "httpbin.org",
//         .path = "/post",
//         .json_body = "{\"name\":\"STM32\",\"value\":42}",
//         .port = 80
//     };
//     http_request_send(&request);
// }

// // 示例：发送GET请求
// void send_http_get() {
//     HttpRequest request = {
//         .type = HTTP_GET,
//         .host = "httpbin.org",
//         .path = "/get",
//         .json_body = NULL,
//         .port = 80
//     };
//     http_request_send(&request);
// }
/**
 * @brief 从ESP8266接收HTTP响应并解析
 * @param response 解析后的响应数据（需调用http_response_free释放内存）
 * @return true解析成功，false失败
 */
bool http_response_receive(HttpResponse *response) {
    if (!response || uart_rx_length == 0) {
        return false;
    }
    
    // 1. 清空响应结构体
    memset(response, 0, sizeof(HttpResponse));
    
    // 2. 查找HTTP状态码（如 "HTTP/1.1 200 OK"）
    char *status_line = strstr(uart_rx_buffer, "HTTP/1.");
    if (status_line) {
        sscanf(status_line, "HTTP/1.%*d %d", (int *)&response->status);
    } else {
        return false; // 非HTTP响应
    }
    // printf("status_line:%s\n", status_line);
    // 3. 分离响应头和响应体（通过 "\r\n\r\n" 分隔）
    char *body_start = strstr(status_line, "\r\n\r\n");
    // printf("body_start:%s\n", body_start);
 
    if (body_start) {
        body_start += 4; // 跳过空行
        response->body_len = uart_rx_length - (body_start - uart_rx_buffer);
        
        // 分配内存并拷贝响应体
        response->body = (char *)malloc(response->body_len + 1);
        if (!response->body) {
            return false;
        }
        memcpy(response->body, body_start, response->body_len);
        response->body[response->body_len] = '\0';
        
        // 可选：拷贝响应头（示例中省略，实际可按需解析）
        response->headers = NULL;
    } else {
        return false; // 响应格式错误
    }
    
    return true;
}

/**
 * @brief 释放HttpResponse动态分配的内存
 */
void http_response_free(HttpResponse *response) {
    if (response) {
        if (response->headers) free(response->headers);
        if (response->body) free(response->body);
        memset(response, 0, sizeof(HttpResponse));
    }
}



// // 示例：发送POST请求并接收响应
// void test_http_post() {
//     // 1. 发送请求
//     HttpRequest request = {
//         .type = HTTP_POST,
//         .host = "httpbin.org",
//         .path = "/post",
//         .json_body = "{\"name\":\"STM32\"}",
//         .port = 80
//     };
//     http_request_send(&request);

//     // 2. 接收响应
//     esp8266_uart_receive(); // 阻塞式等待数据（实际项目中建议用中断+DMA）
    
//     HttpResponse response;
//     if (http_response_receive(&response)) {
//         printf("Status: %d\n", response.status);
//         printf("Body: %s\n", response.body);
//         http_response_free(&response); // 释放内存
//     }
// }

